package cn.caplike.demo.netty.heartbeat;

import io.netty.channel.ChannelInitializer;
import io.netty.channel.ChannelPipeline;
import io.netty.channel.socket.SocketChannel;
import io.netty.handler.timeout.IdleStateHandler;

import java.util.concurrent.TimeUnit;

/**
 * <ul>
 *     <li>如果服务端启动, 客户端也启动后, 5秒没有信息, 则会触发读空闲.</li>
 *     <li>如果服务端启动, 客户端也启动后, 5秒内客户端发出信息, 但是服务端没有回复, 则会触发写空闲.</li>
 *     <li>如果服务端启动, 客户端也启动后, 读写都正常了但是10秒没有交互, 则会触发读写空闲</li>
 * </ul>
 *
 * @author LiKe
 * @version 1.0.0
 * @date 2021-11-27 21:07
 */
public class MyServerChannelInitializer extends ChannelInitializer<SocketChannel> {
    @Override
    protected void initChannel(SocketChannel ch) {
        ChannelPipeline pipeline = ch.pipeline();

        // http 是基于请求响应的, 请求 -> 响应, 然后连接断开
        // tcp 则复杂很多, 所以采用心跳的机制 ↓
        pipeline.addLast(new IdleStateHandler(
            5  /* 过了5s后客户端并没有像服务端发送任何数据 */,
            7  /* 重启客户端后, 客户端写内容, 服务端过了7s提示写空闲, 服务端收到数据没有向客户端写数据 */,
            10 /* 改成3s后内要么没有读,要么没有写, 会触发 */,
            TimeUnit.SECONDS)); // 空闲检测的处理器: 读空闲, 写空闲, 读写空闲
        pipeline.addLast(new MyServerChannelInboundHandler());
    }
}
